feat(meta-and-voc-onboarding): Meta + VoC onboarding package - installable by name - #172
Open
Eric Smith (motionBuilderEric) wants to merge 49 commits into
Open
feat(meta-and-voc-onboarding): Meta + VoC onboarding package - installable by name#172Eric Smith (motionBuilderEric) wants to merge 49 commits into
Eric Smith (motionBuilderEric) wants to merge 49 commits into
Conversation
…docs, drop corpus-search Replaces the Aligned Onboarding payload with the v2 package: Creative Attribution playbook (runs first, explicit request only), Account Context Brain onboarding package v1.21, new Meta Validation package v1.1, and the Motion CLI data-query guide. Removes the corpus-search tool and its references; retrieval runs on Knoweth with per-creative summaries in Cacheth (staging). Nothing self-runs on install: the attribution build and its maintenance never auto-grab creatives and store summary files in the brain. Drops the orchestration skill and rebuilds install-config.json (v2.0.0).
Eric Smith (motionBuilderEric)
marked this pull request as ready for review
July 22, 2026 23:05
…ect-time auto-install and self-activating daily sync (#159) * feat(package): add voc-data-pull v0.1.0, auto-installed on VoC platform connect Installer package that pulls raw voice-of-customer data - product reviews, support conversations, and ad comments - from a connected platform into standardized files in the org brain: one file per review/ticket/comment, flat metadata header + body, untouched platform payload preserved in every file (PDEC-9193, PR 1 of 2). - skill/SKILL.md: the pull workflow - resolve the connection path (Pipedream OAuth via integrations proxy, stored secret via secure-fetch, Motion native for Meta ad comments), follow the platform recipe, write files under /agent/brain/data-sources/<platform>/. Hard boundaries: read-only against platforms, bounded pulls (12-month default, page caps), never write into /agent/brain/integrations/<source>/, author_contact nulled pending the PII policy call. - skill/references/platform-recipes.md: per-platform endpoints, pagination, discovery steps, and unified-template field mappings with evidence levels. Judge.me/Gorgias/Intercom live-verified; Trustpilot/Yotpo doc-grounded pending first connects; Junip blocked on a dead key; Okendo/Stamped are secrets-path (no Pipedream app exists); Meta ad comments via motion meta creative-comments. - skill/templates/: copyable review and support-conversation file skeletons (support shape follows the Ramy Brook Gorgias precedent: daily/<date>/ticket-<id>.md, metadata top, full conversation below). - package.json manifest: one directory resource installing the skill to agent_skills/voc-data-pull; installPolicy auto so matching intent installs with no manual step, updatePolicy auto so recipe fixes roll out. - package-index.json: first indexed package. Categories list one integration:<slug> per platform (judge_me, trustpilot, yotpo, junip, gorgias_oauth, intercom, okendo, stamped) because the VM reconciler matches literal connected slugs - no invented family category. - scripts/validate-runneth-package-index.mjs: aligned with the current package-manager contract (package.json manifests, installPolicy, packageManagerVersion 1|2, manifest v2 tasks/workflows, backend-github sources). Same content as #152; whichever merges first rebases clean. - Card files (use-case.json, README.md, marketing.md) included per repo structure; slug added to catalog excluded[] - not a public-site use case. CI note: the fleet-approval gate fires (new auto-installable package) and needs the runneth-fleet-change-approved label after core engineering approval. * refactor(voc-data-pull): move under packages/ per installer package convention * fix(voc-data-pull): resolve review findings - id-keyed ticket paths, honest date-bound claims, PII disclosure, fleet-gate fingerprint * fix(voc-data-pull): render metadata as fenced yaml block instead of frontmatter * feat(voc-data-pull): human-readable file layout - headline, bold-label header, collapsed metadata; drop raw payloads * feat(voc-data-pull): backend-github source + activation package instruction Switch the index entry's package source to backend-github per repo package conventions, so VM artifact fetches route through the backend cache instead of raw GitHub (bump indexRevision to 2026-07-22-01). Add a package_instruction resource (instructions/activation.md) that lands in the agent's standing instructions on install: Runneth offers the first pull when a covered VoC platform is connected and no data-sources pull exists, runs the skill on request, and never starts a pull without user confirmation. Install stages files only; this closes the awareness gap without auto-running anything. * fix(voc-data-pull): date window is the coverage contract - page cap is per-run batching, never a coverage limit * feat(voc-data-pull): add Reddit - integration:reddit category, community_post source type, recipe + template * feat(voc-data-pull): routine-based recurring sync via activation instruction activation.md: routine absence triggers setup - creates voc-sync-<platform> (cron 0 6 * * *), kicks the backfill run, silent-success/delivered-failure delivery, Junip key gate; pulls never run in-conversation. SKILL.md: new Recurring sync runs section owns the incremental window (empty folder = trailing 12 months, else newest created_at minus 2 days, updated_at for tickets), multi-account iteration, disconnect no-op; dropped the confirm-before-starting gate. README updated to match. * fix(voc-data-pull): review fixes - id-keyed contract, per-source write policy, routine routing SKILL.md: the id-keyed filename contract now survives existing folder conventions (adopt surrounding layout, keep id-keyed names); explicit re-pull write policy per source type (reviews skip, tickets overwrite on fresher updated_at, comments/posts overwrite inside the pull window since engagement mutates); user pull requests route through the sync routine; description covers Reddit and community posts. activation.md: routine prompt defers run behavior to the skill's recurring-sync rules instead of restating it; first kick described as a sync run whose window the skill determines. README: drop the stale no-automatic-post-install-trigger gap, describe the header shape directly, point the platform list at the Step 1 table. * fix(voc-data-pull): move output to data-sources/voc/<platform>/ with flat type-prefixed filenames * feat(voc-data-pull): manual install policy, ask-only sync setup installPolicy flips to manual - the team installs per VM (package intent add-optional voc-data-pull + package sync); updatePolicy stays auto so installed copies track main. Setup is strictly manually triggered: the recurring-sync procedure (routine-absence check, routine add with cron 0 6 * * *, first-run kick, Junip gate, never pull in-conversation) moves into SKILL.md and runs only when asked, directly or via an onboarding run - nothing happens just because a platform is connected. The activation instruction slims to a pointer stating the same. Once set up, the daily routine refreshes data on its own. Categories retained for a future auto-install flip.
…amily lanes as forward path) (#175) * feat(aligned-onboarding): add Knoweth organize part * chore(aligned-onboarding): register knoweth part in install-config (v2.2.0) * docs(aligned-onboarding): add Knoweth organize step to run order * feat(knoweth): expand organize part with save routing, decide-lanes/config, standard specs, front-matter, repair, validation, gotchas (option B, consistent) * feat(knoweth): v1.0 - de-draft, activation MERGE INSTRUCTIONS, why-not-in-Knoweth, no-Knoweth-aware, user/workspace lane scenarios, org-type adaptation, standard-spec detail, maintenance section * feat(knoweth): activation checklist, prod/pre-Knoweth note, org-type detection step * docs(aligned-onboarding): make Knoweth run-order step name both guard merges * feat(aligned-onboarding): v2.3.0 - Cacheth is the creative system of record, no per-creative brain files - Rewrite the Creative Attribution playbook as the creative-content-layer contract: what Cacheth holds per creative, the query paths (Knoweth injection first, then the motion cache CLI), and the naming decode - all local, no API calls, nothing written to the brain - Fold the naming decode into account-context.md Field 4 (no separate taxonomy file); Field 4 starts from the Step 1 provisional table - Reframe per-creative-file rules from prohibition to ownership: person-requested snapshots allowed, sweep asks before archiving - Validation (v1.3) gates on cache coverage instead of files and adds the show-the-work loop rule - Upgrade the Knoweth answer standard: read the naming decode before name filters, route structural vs creative questions by signal, frame performance + VoC as one system, state filter/signal/unconfirmed on analytical answers - Stage the Cacheth command reference beside the Data-Query Guide; reconcile all cache command syntax against it Co-authored-by: Cursor <cursoragent@cursor.com> --------- Co-authored-by: rachelgrant27 <rgrantsteinkrauss@gmail.com> Co-authored-by: Cursor <cursoragent@cursor.com>
…ributes, add name-level filter disambiguation, trim Data-Query Guide to Meta-only Creative Attributes describes attributes of the creative, not spend attribution. New name-level contract closes a live failure mode where product names were read as campaign references: the Data-Query Guide gains a "Which name level to filter on" section, Field 4 (v1.22) detects and confirms where product names live per account, the Step 1 decode hands over provisional token placement, and validation (v1.4) probes the read with a "show me all our [product] ads" starter question. Data-Query Guide drops the TikTok insights section, the brand-specific metric gotchas, and the workspace-goal / spend-threshold commands the package's scope rules already forbid. Co-authored-by: Cursor <cursoragent@cursor.com>
…23 (naming decoder JSON, Field 9 four captures) Reconciles parallel work authored against the pre-merge base: - Field 4 writes an operational naming decoder to /agent/brain/meta/naming-decoder.json: typed positions (segment_filter / context_only / unique_id / metadata_do_not_filter) mapped to Meta query fields, LP-reference decode (RLP/LP/CAP, do-not-filter), and the _VALUE_ filter-translation rules. Field 4 stays the interpretation owner; the decoder is its appendix, referenced from account-context.md, not embedded - Field 9 restructured around four captures: ranking metric, CPA target (commentary, not a filter), winner/cut criteria applied only to explicit winner/cut questions (spend floor, min days, optional tiers with the rank-then-classify rule), and the default reporting window; supersedes v1.21's mandatory always-ask spend-floor script - Merged with the v1.22 product-name-placement additions and the Step 1 provisional decode handoff; playbook, README, Knoweth answer standard, skeleton, and validation updated to point at the decoder Co-authored-by: Jose <jose@motionapp.com> Co-authored-by: Cursor <cursoragent@cursor.com>
…l referenced by the 2.4.0 install entry Co-authored-by: Cursor <cursoragent@cursor.com>
…k-sources named, raw-VoC save exemption, Reddit full-window contract
…as ACB v1.24 + validation v1.5; README covers the validation step Field 10 (reporting structure and marketing calendar) synthesizes from Fields 4, 7, and 9 - no new Motion pull - with an auto-detected calendar from the naming decoder's campaign-type and launch-date positions (read from naming-decoder.json, never an assumed offset) and four standard deck sections as a starting hypothesis. Scope rule: Field 10 gates the deck, not validation - the question loop runs on the nine required fields; no deck without a confirmed Field 10, and an unconfirmed spec runs its two beats at deck time. Validation v1.5 pre-fills the deck build from the spec, leads the deck-first door with it, and anchors starter questions 2 and 4 in the confirmed dimensions and calendar. Jose's stale-base regressions (Creative Corpus paths, missing product-name placement and tier rule) were discarded. Also reconciles the README with Eric's operational intro: adds the missing Meta Validation detail section, the validation step in the install/run order, and the validation-is-the-catch relation bullet. Co-authored-by: Cursor <cursoragent@cursor.com>
… pull to 17 platforms Add a post_install trigger to install-config.json (v2.5.0) backed by a new post-install.md: installing the package now automatically runs the reachability check, sets up the recurring VoC sync for every available platform (backfills kicked in the background), and starts the Meta Creative Attribution and Account Context Brain steps - zero human prompt required. Knoweth organize still fires from its own gates. README's trigger section is rewritten to describe this automatic sequence, with per-part fire-at-install vs on-demand labels, and VoC wording fixed from connected to available (stored keys and Motion native count). VoC skill: expand coverage from 9 to 17 platforms with doc-grounded recipes for Zendesk, Klaviyo, Attentive, Gong, Hotjar, Discord, YouTube, and Reviews.io; fold in registry live-probe learnings (Junip unblocked and live-verified, Yotpo since_date is the real date bound, Trustpilot/Klaviyo/Gong/Gorgias corrections). Add the Step 2 resilience mandate: the live API is the truth and a stale recipe must never stop a pull. Single-source the docs - per-platform evidence and caveats live only in recipe headers, and the coverage contract (12-month window, page-cap resume, coverage reporting) is owned solely by SKILL.md's hard boundaries; the stale updated_at_min references are gone.
…ecipe list - unknown platforms pull live-adapted An unknown VoC platform is never skipped. The skill's scope gate changes from "is it on the covered list" to "is the data customer voice": any reachable reviews/support/survey/community platform with no recipe resolves its connection path like the others (proxy or secure-fetch with the registry guide's auth shape) and pulls through a new no-recipe path in Step 2 - find the listing endpoints from the live API and docs, discover pagination from the response, map the real payload onto the unified record, pull the raw data you find, and report "no recipe - live-adapted" with the calls used so a recipe can be written from the run. A missing recipe is never a reason to stop; skipped can only mean not reachable, not VoC, or dead auth. Priority stays with the known platforms: recipe'd platforms are handled first, and a platform that has a recipe is always pulled through its recipe, never freelanced. Hard boundaries (read-only, 12-month window, id-keyed files, PII null) and the output contract apply identically to no-recipe pulls. Sync setup and the key-auth gate cover no-recipe platforms; post-install's reachability check and the README state the scope rule; the recipes header points platforms without a section at the no-recipe path.
…T-vs-WHY evidence split, ACB fill-in output schema + Field 10 wiring Rolls up v2.8.0-2.9.0 (rebased over Eric's v2.7.0 auto-fire + 17-platform VoC push): creatives always render as a gallery with decoder-normalized names (Data-Query Guide contract, validation v1.6 loop rule, skill output); the ad-performance skill's trigger broadened from single-ad to ads in general with an Analyzing Across Ads section; ACB v1.26 adds the three-part required output schema for the fill-in presentation and wires Field 10 into the flow and saved file (Step 5, deck-spec section); golden rule 10 splits evidence - live metrics answer WHAT, Cacheth creative content and VoC answer WHY; audit cleanup (single-ad README label, stale workspace-setup intro). Co-authored-by: Cursor <cursoragent@cursor.com>
…xes, changelogs relocated to repo-only CHANGELOG.md - v2.9.1: WHAT-vs-WHY section trimmed to evidence homes + pairing principle - v2.10.0: answering-posture guidance (judgment over rules) in the Data-Query Guide; validation v1.7 register corrections; ACB v1.27 answer-register note - v2.11.0: validation v1.8 autosave/resume, MVCE-to-Knoweth handoff, Q4 rework with single-pool fallback; knoweth v1.1 gate-2 file-based VoC fallback; gallery mediaUrl warning - v2.11.1: per-doc changelog histories moved out of staged docs into aligned-onboarding/CHANGELOG.md (maintainer-only, never staged to customer brains) Co-authored-by: Cursor <cursoragent@cursor.com>
…name, deterministic fast install (#179) * feat(aligned-onboarding): deterministic install via package.json manifest + staged guard files Replace install-config.json with a real package manifest so 'package install' stages all files mechanically in one call. Ship the four /agent/user.md guard blocks as ready-made staged files under guards/ merged in one full-file write at post-install. No behavior changes to any part. * fix(aligned-onboarding): fire post-install from activation prompt context; mandate github: ref form * perf(aligned-onboarding): scripted guard merge, kicked-run checklist, no edit tool on staging VMs * feat(aligned-onboarding): register as indexed package for intent add + sync install lane * fix(aligned-onboarding): single-Write guard merge with anti-duplication check; always create voc-sync-meta-ads; persist autofill * docs(aligned-onboarding): headline install-by-name from the package index * feat(aligned-onboarding): v2.9.0 - presenting-creatives contract, WHAT-vs-WHY evidence split, ACB fill-in output schema + Field 10 wiring Rolls up v2.8.0-2.9.0 (rebased over Eric's v2.7.0 auto-fire + 17-platform VoC push): creatives always render as a gallery with decoder-normalized names (Data-Query Guide contract, validation v1.6 loop rule, skill output); the ad-performance skill's trigger broadened from single-ad to ads in general with an Analyzing Across Ads section; ACB v1.26 adds the three-part required output schema for the fill-in presentation and wires Field 10 into the flow and saved file (Step 5, deck-spec section); golden rule 10 splits evidence - live metrics answer WHAT, Cacheth creative content and VoC answer WHY; audit cleanup (single-ad README label, stale workspace-setup intro). Co-authored-by: Cursor <cursoragent@cursor.com> * feat(aligned-onboarding): v2.11.1 - answering posture, field-audit fixes, changelogs relocated to repo-only CHANGELOG.md - v2.9.1: WHAT-vs-WHY section trimmed to evidence homes + pairing principle - v2.10.0: answering-posture guidance (judgment over rules) in the Data-Query Guide; validation v1.7 register corrections; ACB v1.27 answer-register note - v2.11.0: validation v1.8 autosave/resume, MVCE-to-Knoweth handoff, Q4 rework with single-pool fallback; knoweth v1.1 gate-2 file-based VoC fallback; gallery mediaUrl warning - v2.11.1: per-doc changelog histories moved out of staged docs into aligned-onboarding/CHANGELOG.md (maintainer-only, never staged to customer brains) Co-authored-by: Cursor <cursoragent@cursor.com> * feat(aligned-onboarding): v2.12.0 - unify content lane (2.11.1) with installer lane (2.8.4) --------- Co-authored-by: rachelgrant27 <rgrantsteinkrauss@gmail.com> Co-authored-by: Cursor <cursoragent@cursor.com>
… recipe (verbatim installed.json resources)
…tim manifest entries
Eric Smith (motionBuilderEric)
force-pushed
the
eric/aligned-onboarding-v2-meta-package
branch
from
July 25, 2026 19:47
335dfe4 to
19a28d6
Compare
…ge describes desired state only
…se gate Co-authored-by: Cursor <cursoragent@cursor.com>
Eric Smith (motionBuilderEric)
force-pushed
the
eric/aligned-onboarding-v2-meta-package
branch
from
July 26, 2026 00:36
77adbdb to
fce81c3
Compare
…n connection status is unreadable
… on a human's yes - new onboarding-walkthrough skill (v1.0) owns the fill-in presentation; fires on "Are you ready to begin your onboarding?" - ACB package (v1.29) drops the output schema + Steps 2-5, becomes the pure data layer; v1.28 adds format-per-data and the Field 4 inline decoder table rule - post-install autofills and persists silently, ends with the verbatim invitation - account-context guard v2 offers the walkthrough; Creative Attributes scope confirmation silent inside post-install - package.json + package-index.json synced to 2.13.0 Co-authored-by: Cursor <cursoragent@cursor.com>
…north-star" renamed to plain language - post-install step 6 gains a literal contract: one status line per part + question count, verbatim skeleton, no findings or question text before the invitation (first 2.13.0 field run leaked both) - ACB v1.30 / validation v1.9: "north-star" -> "primary conversion event" and "priority campaign(s)" in all customer-facing phrasing - package.json + package-index.json synced to 2.13.1 Co-authored-by: Cursor <cursoragent@cursor.com>
…, raw github source Rename aligned-onboarding to meta-and-voc-onboarding (id, folder, staged paths, all docs; the immutable pre-cleanup tag keeps its name). Version policy is now a simple integer bumped once per package update, starting at 1, with the CHANGELOG collapsed to that entry. The index entry moves to categories: [] and a raw github source. Docs replace bare `integrations status` with `integrations status --app <slug>` sweeps and fix the `n run --url` typo to `secure-fetch run --url`. The validator matches the runtime contract: opaque non-empty versions, github-only sources, empty categories allowed, fleet approval checked only on pull_request events.
Eric Smith (motionBuilderEric)
force-pushed
the
eric/aligned-onboarding-v2-meta-package
branch
from
July 27, 2026 22:00
1d78d8d to
e70505c
Compare
…edback heals context - validation v1.10: durability routing for every piece of feedback (judgment rules -> ACB fields, standing prefs -> register/Field 10/deck record, current-state -> answer only, one-offs -> current render, revert on refresh); deck feedback routes to fields and the deck regenerates from context, never hand-edited; MVCE needs every question clean (corrections re-open only what they touch) plus spec-level deck approval; loop continues past MVCE with no scheduled check-ins - validation gate guard v3: deck change requests are context corrections, always-on - ACB v1.31: Field 10 named as the landing spot for structural deck feedback Co-authored-by: Cursor <cursoragent@cursor.com>
…th indexing model
Verified against agent-builder origin/staging (motion.ts, cache/exporters.ts,
cache/storage.ts) before editing.
- Access check first: playbook Step 2 opens with one
`motion cache status --workspace-id <workspaceId>` call; on error, record the
blocker and stop — no retry loops against the data commands. Same status-first
note in the command reference overview.
- Fix the naming-decoder export flow: `motion cache export-summaries` returns a
./workdir wrapper, not the JSONL corpus. Docs now read the Meta corpus path
from `exportPaths.meta` (command output) or `.providers.meta.path` (wrapper
file) and run `jq -r '.adNames[]?'` against that per-provider file. Old
instructions ran jq against the wrapper and produced an empty name list.
Every Step 2 command now carries an explicit `--workspace-id`.
- Narrow data-surface claims: export and search records carry ad metadata, copy,
landing/media URLs, and summary sections only. Transcripts and glossary/AI
tags live solely on the full record via `motion cache get-creative`; removed
"all transcripts / glossary tags" claims and the glossary jq example on
exports, and dropped the transcript-fragment claim from search.
- Consistent Knoweth<>Cacheth model everywhere: Knoweth indexes the summary
artifacts Cacheth generates (identity, ad names, copy, summary text), never
complete records. Replaces both the "surfaced through Knoweth" overclaim and
the "NOT indexed by Knoweth" underclaim across the package.
- Frame Cacheth as a hydration layer behind the motion CLI, transparent to the
agent.
- Correct storage claims: only the wrapper lands in ./workdir; per-provider
export files live in Cacheth's own storage.
Deliberately unchanged: guards/meta-validation-gate.md and its byte-identical
copy in meta-validation-onboarding-package.md (guard blocks merge verbatim into
/agent/user.md; changing them is a guard-versioning decision).
Staging validation:
- Positive path (cache-enabled orgs): status check ran once before export; the
agent resolved the real corpus from exportPaths.meta, ran jq against the
per-provider JSONL (never the wrapper), and decoded naming systems from
hundreds of real ad names. The old empty-list failure did not reproduce, and
no output claimed transcripts or glossary tags from export/search.
- Negative path (org with the sandbox Motion cache disabled, exercised
deliberately): the status-first gate behaved exactly as written — the agent
ran `motion cache status` once, quoted the playbook rule ("record the
blocker and stop this step — do not loop retries"), recorded the blocker in
the account-context file, and never touched the data commands or drew a
false "no ads" conclusion.
…ed by staging runs
Four fixes to the install-time sequence, each grounded in a staging test
observation:
- Step 1 names the sanctioned stored-secret probe: the secret store cannot be
listed (runtime refuses Bash reads of /agent/.runtime/secrets; neither
`secret` nor `secure-fetch` has a list command), so probe each platform's
documented secret key and treat "secret not available" as not stored. Same
note added to the voc-data-pull skill's availability-check paragraph.
- Step 4 names the Creative Attributes procedure path
(meta/meta-creative-attributes-playbook.md, a brain document) so agents stop
probing for a nonexistent creative-attributes skill directory.
- Step 5 now matches the account-context playbook it delegates to: the brain
file is written in the playbook's saved-file format (prose reference
document) and indexed in /agent/INDEX.md with the playbook's aliases at
install time. The old step text demanded terse facts and deferred INDEX.md,
contradicting the playbook; agents consistently sided with the playbook.
- Step 6 closes two report-leak gaps: decoder shape counts ("a 5-position
decoder", "4 schemas detected") are explicitly decoder detail, and the
status-only discipline extends to the progress narration around the report,
not just the report body.
…VM path The package manifest flattens the repo's meta/ folder into /agent/brain/meta-and-voc-onboarding/, so the playbook lives at meta-and-voc-onboarding/meta-creative-attributes-playbook.md on the VM. Step 4 now names that staged path and forbids improvising the Creative Attributes step from live Motion pulls when the playbook cannot be read.
…ets mechanical Staging runs followed the descriptive wording loosely: one agent concluded 'no stored secrets' from a refused directory read without running a single key probe, and another appended the detected naming convention to the readiness report's Creative Attributes bullet. Step 1 now requires a secret-run probe per key-stored platform before the step is done and rules out indirect checks explicitly. Step 6 now states the template bullets are filled only at their angle-bracket slots, with the allowed states as the only permitted extensions.
…ace and placeholder scope Step 3 told installers to replace every literal <workspaceId> token without saying which workspace is the target; a staging run anchored on a stale id from removed guard blocks and stamped the guards for the wrong workspace, and the 'every token' rule also collided with the knoweth-organize guard's generic project:<workspaceId> lane syntax. The target is now defined as the workspace this conversation's Motion commands resolve to, substitution is scoped to the guard headers, and the lane syntax stays untouched alongside the other placeholders.
…add-optional + sync The package description (manifest and index entry, kept byte-identical) now names the canonical install path: an agent runs `package intent add-optional meta-and-voc-onboarding` followed by `package sync`. The README's intro paragraph and "Install and run order" step 1 said the install conversation stages files "with one `package install` call" - that is the branch-testing command, not the indexed flow. Both now describe the intent + sync pair; explicit `package install github:...` remains documented only as the branch/PR-testing variant.
Eric Smith (motionBuilderEric)
force-pushed
the
eric/aligned-onboarding-v2-meta-package
branch
from
July 28, 2026 13:08
9a7e2e0 to
fe9ab13
Compare
…y install path The intent add-optional + sync flow cannot install this package: sync's manual-policy gate only admits packages with a "selected" sync reason, and selected intent is recorded only by an explicit package install call - optional intent resolves as "optional" and is skipped while installPolicy stays manual. v1 therefore ships beta as a manual install: one explicit package install of the GitHub source at #main, which records selected intent (VM rebuilds reinstall it) while updatePolicy: auto rolls out merged updates. The package README (install banner, canonical message, install path, run order), the root README section, the CHANGELOG v1 entry, and the description field in the manifest and index entry all describe that flow; branch refs remain the branch/PR-testing variant. An intent- or baseline-category-based install ships as a new package version if wanted.
… install sweep
Readiness report (post-install step 6): the template itself mandated the count
leak every install reproduced ("autofilled <N> of 9 fields; <M> questions need a
human"). The Account Context Brain bullet is now status-only ("done - remaining
gaps wait for the walkthrough"), the version label is dropped from the header
line (installs hallucinated four different labels for one artifact), and the
no-findings rule is now a blanket no-numbers rule (no counts, tallies, sample
sizes, or version labels anywhere in the report or the narration around it)
with a literal wrong/right example.
PR-URL resolution (README branch testing): step 1 prescribed gh pr view, which
fails with a 409 on every VM (GitHub is never connected there). The step now
says so and gives the working path: curl the public pulls API and read
.head.ref - the same fallback agents discovered on their own.
Staged paths (README): the five per-doc "File: meta/<doc>.md" lines and the
knoweth doc pointer were repo source paths, but the manifest stages those docs
flat; on-VM agents resolving them hit ENOENT. Each now carries its staged
/agent/brain/meta-and-voc-onboarding/ path.
One workspace per sandbox (post-install + playbook): the playbook's
multi-workspace section prescribed per-workspace-slug brain paths that the
guards and post-install never supported, so a second-workspace install had to
improvise (observed on staging: hand-copied brain files and rewritten guard
headers, leaving the first workspace unreachable). Both docs now state the one
Meta workspace per sandbox contract: same-workspace sentinels mean the sequence
already ran; different-workspace sentinels mean stop and report - never rewrite
guard headers or copy brain files.
…he account-context playbook path Both staging verification installs of the tightened readiness report produced the same single deviation: a part that completed through a fallback rendered as "done - <explanation>" (Cacheth disabled, decode pulled from ad names instead). Step 6 now states that "done" is terminal - a part that completed through a fallback or degraded path is still exactly "done", and the how belongs in the brain file - and enumerates "blocked - <reason>" among the allowed bullet states. Step 5 referred to "the account-context playbook" without naming its file; one install guessed account-context-playbook.md, hit ENOENT, and recovered via ls. The step now carries the staged path.
…llback ladder (package v2) Cacheth stays first for creative attributes; the live motion meta insights content flags become a failure-only fallback with code-verified semantics (sandbox-level MOTION_CACHE_ENABLED, explicit disabled message). Cache-disabled sandboxes no longer permanently gate validation, brain organize, or the naming decode (validation gate v4, knoweth-organize guard v3, validation doc v1.11). Metrics pulls stay lean and join cached content on creativeId. Adds the agent-builder PRD for enforcing the fallback in the CLI. Co-authored-by: Cursor <cursoragent@cursor.com>
Turn synced customer language into durable, evidence-backed insight that validation and future analysis can reuse without running the audit automatically. Co-authored-by: Cursor <cursoragent@cursor.com>
…orkspace orgs (#186) * feat(meta-and-voc-onboarding): workspace-scoped onboarding v2 - multi-workspace orgs onboard additively One org VM can hold several Motion workspaces, but v1 wrote every outcome to shared org-wide paths (/agent/brain/meta/, /agent/brain/data-sources/voc/), so only one workspace per org could hold Meta context and a second onboarding either overwrote the first or blurred two brands' customer voice into one corpus. v2 re-roots everything the package produces under a per-workspace folder and makes onboarding a second workspace a normal, additive operation. Layout: - All outcomes land in /agent/brain/<workspace>/ (workspace name lowercased, spaces as hyphens): account-context.md, naming-decoder.json, validation.md, _tag-vocabulary.md, and VoC data under data-sources/voc/<platform>/. - /agent/INDEX.md and /agent/brain/_changelog.md stay org-wide with entries naming their workspace. Guards (account-context-guard v3, meta-validation-gate v4, knoweth-organize v3, knoweth-brain v3): - Now workspace-agnostic: merged into /agent/user.md verbatim, once per VM, with no install-time token substitution. Each guard defines the workspace folder and resolves it per conversation, and forbids reading another workspace's folder to answer for this one. Activation: - Post-install records each onboarded workspace in a runneth:meta-voc-onboarded roster block in /agent/user.md; the activation instruction checks the roster for this conversation's workspace, so a second workspace on an already-guarded VM still gets its own install run. Guard sentinels alone are no longer treated as "already onboarded". VoC routines: - One routine per platform per workspace, named voc-sync-<workspace>-<platform> (a bare voc-sync-<platform> would collide VM-wide and mix two brands' data). - Routine prompts carry the workspace folder path, workspace id, and pinned account id literally - routine runs execute with no workspace attached, so nothing is resolvable at run time. VoC account pinning: - Platform accounts are org-level with no workspace tag, and one org can hold several accounts of the same platform (or genuinely share one) - verified against the builder: pipedream_account is unique on (sandbox, app, account) and every proxy call requires --account <accountId>. - Setup pins a human-confirmed account per workspace per platform: the agent lists accounts and asks which belongs to this workspace, even when only one is listed (a lone connection may belong to a different workspace). Sharing is legitimate; a recorded slice filter scopes shared accounts. Auto-pin only when the org has exactly one Motion workspace. No connection-driving: an unconnected platform is recorded as pending and set up on ask later. - Sync runs pull only the pinned account and never fall back to another connection; a disconnected pin reports and stops. Replaces the old "iterate every connected account" rule, which would have re-blurred workspaces. Install flow: - Auto-pinnable platforms and Meta ad comments kick their backfills immediately; platforms needing confirmation are asked in one compact block before the readiness report, show as "waiting on a person - account confirmation", and get their routines created when the answer arrives. - Readiness report header names the workspace (identity, not a finding). Version 2 in package.json and package-index.json, descriptions synced, CHANGELOG entry added. * fix(meta-and-voc-onboarding): make the workspace slug rule mechanical The MrBeast staging install burned thinking time deciding whether "Mr. Beast" slugs to mr-beast or mr.-beast: "lowercased with spaces as hyphens" is non-deterministic for names with punctuation, and two conversations resolving different slugs would split one workspace's brain into two folders. Every <workspace> definition site (4 guards + their embedded copies, post-install, activation, README, playbook, ACB package, voc skill, knoweth doc) now states one mechanical rule: lowercase, every run of characters that is not a-z or 0-9 becomes one hyphen, trim leading and trailing hyphens ("Huel EU" -> huel-eu, "Mr. Beast" -> mr-beast). * fix(meta-and-voc-onboarding): move Meta interpretation files under data-sources/meta and route the later VoC audit Meta interpretation files (account-context.md, naming-decoder.json, validation.md, _changelog.md) now live under /agent/brain/<workspace>/data-sources/meta/, siblings of data-sources/voc/. The later Voice of Customer audit skill writes /agent/brain/<workspace>/data-sources/voc/voice-of-customer-audit.md; raw pulls and post-install never create it. All skills, guards, playbooks, and docs updated to the fully scoped paths. * fix(meta-and-voc-onboarding): define reinstall resume semantics and close review gaps An explicit reinstall or upgrade re-runs post-install as a resume, never a restart: guard merge keeps its skip rule, existing workspace-named routines and brain files are kept, and the roster never lists a workspace twice. The README names the workspace-scoped output path instead of the old brain-root meta folder, and the routine prompt template gains the Motion-native (meta-ads) variant alongside the pinned-account and stored-secret ones. * docs(meta-and-voc-onboarding): correct stale doc/guard version cites in changelog --------- Co-authored-by: Eric Smith <eric@motioncreative.co>
…mmary in walkthrough Fixes from the first real customer-VM install, folded into the workspace-scoped v2: - Field-to-command map names the real ads-grain extraction keys (verified against agent-builder's response schemas): ad rows carry no adName/campaignName/adsetName; identity lives at `name` and in associatedObjectDetails, populated only with --include-associated-objects. Field 4 decodes from the Creative Attributes handoff or adnames grain; response-shape note added to the map and the Data-Query Guide; the playbook's cache-disabled decode fallback switches to adnames grain. - ACB navigation: `## Field N` headings, contents section, read-by-section note. - account-context.md file-metadata block gets an explicit YAML template (fields_confirmed, field_statuses, open_flags, naming_decoder). - Onboarding walkthrough now proactively presents a per-integration Voice of Customer summary after the account-context questions, explains what the audit entails, and hands the person the manual trigger (workspace-scoped paths and voc-sync-<workspace>-* routine names). Co-authored-by: Cursor <cursoragent@cursor.com>
…er voc/meta-ad-comments
…questions and pre-answers in batch (doc v1.13) The validation loop now generates its question set from the confirmed account context instead of a fixed list: parameterized baseline questions plus one derived question per filterable naming-decoder dimension (>=3 creatives, meaningful 7-day spend), a Field 9 winner/cut probe, and a Field 7 testing-pipeline question. Answers pre-fill in batch before any are shown - one no-limit primary insights pull (totalCount checked), a testing-bucket pull, a conditional lifetime pull for lifetime spend floors, and creative content through the content-layer ladder - then the full Q&A presents together under a fixed answer format contract (verbatim question, bullets, table at 3+ comparisons, gallery with decoded names; Winner/Watch/Cut only on the winner/cut question). validation.md tracks generated and confirmed account-specific question counts. No guard changes. Co-authored-by: Cursor <cursoragent@cursor.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Meta and VoC Onboarding (
meta-and-voc-onboarding, package version 1): Meta onboarding (Cacheth-first, three steps + Field 10 deck spec), VoC data pull, Knoweth organize, ad-performance + walkthrough skills, installable by name, corpus-search removedSummary
Replaces the legacy Aligned Onboarding payload with the
meta-and-voc-onboarding/folder: one part per subfolder —meta/,voc-data-pull/,voc-audit/,knoweth/,meta-ad-performance-analysis/, andonboarding-walkthrough/— with a single combined README and a real schema-v1package.jsonmanifest (package version1; versions are simple integers bumped once per package update) mapping every file. The package is registered in the repo rootpackage-index.jsonwithinstallPolicy: manual- nothing installs it except one explicitpackage install "github:Motion-Creative/runneth-apps/meta-and-voc-onboarding#main"call. The completed install records selected intent, so it survives VM rebuilds, andupdatePolicy: autorolls out merged updates; uninstall is clean. The canonical install message carries the kickoff clause ("...then read/agent/brain/meta-and-voc-onboarding/post-install.mdand execute its install-time sequence in this conversation" - exact copy-paste text in the package README), so the installing conversation runs the full setup end to end; anactivationpackage instruction staged with the files backstops later sessions. Measured end-to-end on staging, install-to-gap-questions went from 16m08s to 10m47s versus the old LLM-copiedinstall-config.jsonflow. Creative content is Cacheth-first (no per-creative files anywhere), the Meta flow runs as three steps (Creative Attributes → Account Context Brain → Validation) with Field 10 as the deck spec, 17 VoC platforms get standardized raw-data pulls with daily sync routines, Knoweth gets an organize-the-brain part grounded in the real retrieval wiring, and thecorpus-search/tool is removed. Everything the package persists is workspace-scoped — one/agent/brain/<workspace>/folder per workspace, workspace-agnostic guards, a per-workspace activation roster, and a per-workspace pinned account for each VoC platform — so several workspaces on one org VM onboard additively. This targets the staging deployment, where retrieval runs on Knoweth and creative summaries live in Cacheth, so nothing in the package builds or depends on a local search index.What changed
Meta part (
meta/), three steps plus two supporting references:meta-creative-attributes-playbook.md— Step 1 (renamed from Creative Attribution: the step establishes attributes of the creative, not spend attribution). The creative-content-layer contract plus naming decode: creative content lives in Cacheth (the local creative cache), queried via Knoweth pre-context injection first, then themotion cacheCLI (search-summaries/get-creative; local, no API call). No per-creative files are written. The decode is a handoff: detected provisionally here (including where product tokens live across name levels) and folded into the Account Context Brain (Field 4) on confirmation.meta-account-context-brain-onboarding-package.md— Step 2, v1.31. Nine required interpretation fields plus Field 10 (the deck spec), opening brand frame, closing TLDR. Field 4 owns the confirmed naming decode and writes the operational decoder to/agent/brain/<workspace>/data-sources/meta/naming-decoder.json(typed positions, query fields,_VALUE_filter patterns, LP-reference decode); it also detects and confirms where product names live. Field 9 is structured around four captures (ranking metric, CPA target, winner/cut criteria incl. spend floor, default reporting window). Field 10 (reporting structure + marketing calendar) synthesizes from Fields 4/7/9 with no new pull — it gates the validation deck, not the question loop, is offered as fill-in Step 5 once its inputs confirm, and is saved as the deck-spec section ofaccount-context.md. The fill-in presentation has a required three-part output schema (opening frame, field sections, closing TLDR) with a literal skeleton and pre-send checklist — structure fixed, content account-specific. The "at a glance" section can carry a one-line answer-register note written by validation's register corrections. Persists to/agent/brain/<workspace>/data-sources/meta/account-context.mdwith a read-before-performance guard merged into/agent/user.md.meta-validation-onboarding-package.md— Step 3, v1.12. The answer-and-confirm loop with the show-the-work rule (each answer states which filter, signal, and name level it used), the show-the-creatives rule (referenced creatives render as a gallery per the Data-Query Guide contract), register corrections (how an answer is pitched is correctable like any fact; standing preferences persist to account-context.md), a name-level probe starter question ("show me all our [product] ads"), and a conditional customer-voice starter question when the workspace's VoC audit exists;validation.mdwritten incrementally after every confirmed answer so interrupted validations resume instead of restarting; starter question 4 uses neutral testing-vs-scaling language with a single-pool fallback; the weekly deck build pre-filled from the Field 10 deck spec (no deck without it — an unconfirmed spec runs its two beats at deck time; questions-only customers never need it); lock-in (deck approval, refresh routine, Slack); and the MVCE gate, which ends with an explicit handoff to the Knoweth organize part. Validation runs as a training loop: every piece of feedback routes through a durability test (judgment rules heal ACB fields, standing preferences persist to the register note or Field 10, current-state facts shape the answer only, one-offs revert on refresh), and deck change requests are context corrections — the deck regenerates from context and is never hand-edited. Gates on cache coverage, not files.motion-cli-data-query-guide.md— the canonical contract for Motion CLI pulls, now Meta-only (TikTok insights, brand-specific metric gotchas, and the workspace-goal / spend-threshold commands removed). New "Which name level to filter on" section: product/theme words legitimately cascade across campaign, ad set, and ad names; bare product names default toadName+ includes; never silently swap levels. Adds the WHAT-vs-WHY evidence split (live metrics answer what; Cacheth creative content and VoC answer why, with ad comments bridging the two; metrics pick the set, content explains it), the presenting-creatives contract (creatives render as a gallery of cards with media from the Cacheth record'surl— the insightsmediaUrlis often null on ASC — and names always decoded throughnaming-decoder.json), and the answering-posture section (judgment over rules: report data-answerable questions plainly, offer interpretation instead of dumping it, respect mode signals like "just the numbers"). Performance metrics are pulled live, never stored.cacheth-command-reference.md— the flag-level contract for the fivemotion cachecommands.motion cache statusruns first as a one-shot access check; exports are a two-hop flow (the command's workdir wrapper file carries.providers.<provider>.pathpointing at the JSONL corpus in Cacheth's own storage); transcripts and AI glossary tags exist only on the full record viaget-creative— export, search, and Knoweth injection are summary-level (ad metadata, copy, media URLs, summary text). Cacheth itself is a hydration layer behind the CLI, transparent to the agent; Knoweth indexes the summary artifacts generated from it, never the complete records.VoC Data Pull part (
voc-data-pull/):SKILL.mdplusreferences/platform-recipes.mdand four output templates, installed to the skills root (/agent/.agents/skills/voc-data-pull/). Pulls raw voice-of-customer data — reviews, support conversations, community posts, ad comments — from 17 platforms (Judge.me, Trustpilot, Yotpo, Junip, Okendo, Stamped, Reviews.io, Gorgias, Intercom, Zendesk, Klaviyo, Attentive, Gong, Hotjar, Discord, YouTube, Reddit, plus Meta ad comments) into standardized files under/agent/brain/<workspace>/data-sources/voc/<platform>/, one id-keyed file per item. Meta ad comments are the standard pull of every onboarding (any org with Meta connected gets them, no discovery or account pin): they land beside the other platform folders as one file per creative undervoc/meta-ad-comments/(creative-<creative_asset_id>.md), each carrying every comment (author, date, per-comment facebook/instagram platform, reactions, replies nested under parents), the creative's preview URL when the payload returns one (previewFileUrl— the payload carries no post permalink), and the total comment count, with field names mapped 1:1 from the verifiedmotion meta creative-commentspayload. Coverage is by availability (OAuth, stored API key, or Motion native), with a raw-VoC save exemption and the Reddit full-window contract.external_id/created_atgenuinely don't exist. Docs are single-sourced: per-platform evidence levels and caveats live only in each recipe's header (Junip live-verified, Yotposince_datecorrected, the eight new platforms doc-grounded), and the coverage contract (12-month window, page-cap resume, coverage reporting) is owned solely bySKILL.md's hard boundaries.voc-sync-<workspace>-<platform>, 6am), first run backfills 12 months in the background, daily runs pull only new items. Pulls never run inside the installing conversation.Knoweth organize part (
knoweth/):knoweth-organize-onboarding-package.md— the cross-cutting organize-the-brain part: after the account questions are answered and content has landed, organize retrieval (shared content in thegloballane, sliced with tags and a naming decoder) and hold it with two sentinel guard blocks merged into/agent/user.md. Grounded in the real harness wiring: onlyglobal,user:<userId>, andproject:<workspaceId>are queried today; data-source-family lanes are a documented forward path gated on a harness change. Durable done-marker:/agent/brain/<workspace>/_tag-vocabulary.md. v1.1: gate 2 gains a file-based coverage fallback for VoC data that landed without a sync routine.Meta Ad Performance Analysis skill (
meta-ad-performance-analysis/):account-context.md(guard-enforced), metrics from live CLI pulls, name filters through the confirmed decode. On-demand only.Onboarding Walkthrough skill (
onboarding-walkthrough/):Voice of Customer Audit skill (
voc-audit/):/agent/brain/<workspace>/data-sources/voc/voice-of-customer-audit.md, Knoweth-indexed with raw-item citations. The workspace's first fully covered backfill offers the audit once (the offer recorded in the workspace_changelog.md); it runs only on a person's yes or explicit request — never on connection, sync, install, or daily refresh — and approved reruns regenerate the page rather than duplicating it.meta-ad-performance-analysisreads it for customer-side WHY and what-to-make-next questions; raw pulls and post-install never create it, and its absence at install is expected.Multi-workspace scoping and VoC account pinning:
/agent/brain/<workspace>/— the Meta interpretation layer underdata-sources/meta/, VoC items underdata-sources/voc/<platform>/,_tag-vocabulary.mdand the workspace_changelog.mdat the workspace root. The folder name derives from one mechanical slug rule (lowercase, every run of non-alphanumerics becomes one hyphen, trim edge hyphens; "Mr. Beast" ->mr-beast), stated identically everywhere the slug appears. The staged package folder (/agent/brain/meta-and-voc-onboarding/) stays shared and workspace-agnostic./agent/user.mdguard blocks carry no workspace IDs — they resolve the conversation's workspace at runtime and merge once per VM. Arunneth:meta-voc-onboardedroster block in/agent/user.mdrecords which workspaces completed post-install; guard-sentinel presence alone does not count as proof. A second workspace on an already-guarded VM onboards additively (new folder, roster append, nothing of the first touched), and an explicit reinstall or upgrade re-runs post-install as a resume, never a restart.--account), stored secret (named key + confirmed identity), and Motion-native meta-ad-comments (--workspace-idscope, no account).corpus-search removed:
corpus-search/deleted entirely. RootREADME.mdandMIGRATION.mdupdated so the compatibility set is now justbuilding-integrations; manifest-name references corrected topackage.json. The removed payload stays recoverable fromarchive/full-libraryand the pre-cleanup tag.Install mechanics (package manager):
install-config.jsonis gone;meta-and-voc-onboarding/package.json(schema v1, version1,categories: [],installPolicy: manual,updatePolicy: auto,uninstallPolicy: allowed) maps every doc, the four skills, the staged guard files, and the activation instruction. Registered inpackage-index.json(sourcegithubatmain). One package-manager call stages everything deterministically; a branch ref instead of#mainis only for testing an unmerged branch or PR./agent/user.mdguard blocks ship as ready-made staged files (guards/, byte-identical to the blocks embedded in the docs), merged in one whole-file Write — byte-for-byte with no install-time token substitution (the blocks are workspace-agnostic and resolve the conversation's workspace at runtime), with a mandatory pre-write check that the base document and each sentinel pair appear exactly once.meta-and-voc-onboarding/CHANGELOG.md(never staged to customer brains) is a single v1 entry describing the package as it ships; each staged doc keeps its version header.Activation model (
instructions/activation.md+post-install.md):post-install.mdand execute its install-time sequence in the same conversation; anactivationpackage instruction staged with the files also lands in the agent's standing instructions as a backstop for later sessions. The sequence is idempotent per workspace (therunneth:meta-voc-onboardedroster in/agent/user.mdis the ran-already marker; an explicit reinstall or upgrade re-runs as a resume, never a restart): reachability check (OAuth connections, stored secrets, Meta workspace), VoC sync setup for every reachable platform with first runs kicked (a connected Meta workspace counts —voc-sync-<workspace>-meta-ad-commentsvia ad comments), account pinning confirmed with a human when ownership cannot be auto-resolved, the guard merge, Creative Attributes, and the Account Context Brain autofill running silently (results persisted to the brain); it ends by asking "Are you ready to begin your onboarding?" — the findings presentation and gap questions fire only on a human's yes, via the onboarding-walkthrough skill. What the guards gate (Knoweth organize, Meta validation) still fires later on its own gates. One status line per part; if nothing is reachable, it says so and stops (no polling — later connects are set up on ask).secret run --env KEY=<SECRET_KEY> -- trueor a boundedsecure-fetch run— the secret store has no list command, and a refused directory read proves nothing), the guard merge writes the four workspace-agnostic blocks verbatim with no workspace stamping (Knowethproject:<workspaceId>lane syntax stays literal), the Creative Attributes and Account Context steps read their playbooks at explicitly named staged paths (/agent/brain/meta-and-voc-onboarding/meta-creative-attributes-playbook.md,.../meta-account-context-brain-onboarding-package.md) and never improvise if one is unreadable, the account-context brain file is written as a prose reference document and indexed in/agent/INDEX.mdat install, and the end-of-run readiness report is template-only status lines — no metrics, counts, or decoder detail in the report or the narration around it, and "done" is terminal: a part that completed through a fallback or degraded path is still exactly "done" (the how belongs in the brain file), withblocked - <reason>among the allowed states.Notes for reviewers
resolveKnowethReadLanesrequests exactly[user, project:<workspaceId>, global]today). Needs an owner; fits PDEC-9225.naming-decoder.json— never an assumed offset; if the decoder carries neither, it asks for the calendar directly.scripts/validate-runneth-package-index.mjsuntouched — the validator update for the current contract (integer versions, empty categories,githubsource) lands separately in fix(packages): align package index validation contracts #184. The fleet-approval gate still applies: this PR registers a managed-sync package, so it needs therunneth-fleet-change-approvedlabel after core engineering approval (not self-applied)./agent/user.mdis blocked from Bash (hence the single-Write guard merge)./agent/.runneth/packages/. Hand-written package state has produced invalidinstalled.jsonentries in the field that blocked every later turn on the VM.Staging validation
motion cache statuscall, blocker recorded, step stopped with no retry loops — exactly as the playbook prescribes.package installwith no retries or hand-copying, the guard merge matching the staged blocks whileproject:<workspaceId>stays literal, secrets probed only viasecret run, and the readiness report matching the template byte-for-byte — including a Cacheth-disabled run whose Creative Attributes line rendered as baredonewith the blocker recorded in the brain file, and a run with pre-existing/agent/user.mdcontent proving the guard merge appends rather than overwrites.mr-beast, Meta files underdata-sources/meta/, workspace-agnostic guards merged, roster written, the workspace's Meta ad-comments sync routine created with the backfill running in background, readiness report status-only. Multi-account pinning has no live fixture on GR0 (no VoC provider with two connected accounts); the pin flow is exercised by review only so far.package uninstallleaves merged guard blocks and brain files on disk, and transient harness errors that retried cleanly.Test plan
package install "github:Motion-Creative/runneth-apps/meta-and-voc-onboarding#main"+ the kickoff clause) stages every file and runs the post-install sequence in the same conversationvoc-sync-<workspace>-<platform>routine per reachable platform, kicks backfills in the background, and never pulls VoC data in-conversation_tag-vocabulary.md) behind its already-merged guard blocksvoc/meta-ad-comments/, with per-comment entries, totals, and no invented URLs/agent/brain/<workspace>/folder, nothing of the first workspace touched--account